package com.test.utils;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Map;

/**
 * @Classname： AnnotationUtil
 * @Description：
 * @Author： xiedong
 * @Date： 2019/11/11 19:59
 * @Version： 1.0
 **/
public class AnnotationUtil {
    public static Annotation ModifyAnnotation(Class className,Class annotationName,
                                       String methodName,String modifyField,Object paramName,Class<?>... paramTypes)
    {
        try
        {
            //反射获取Method：methodName方法、paramTypes不定参数（“语法糖”）-----method
            Method method = className.getDeclaredMethod(methodName,paramTypes);
            //反射当前方法的注解---annotation
            Annotation annotation = method.getAnnotation(annotationName);
            //获取该注解的调用处理器---invocationHandler
            InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation);
            //反射获取注解的属性
            Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");
            //暴力破解
            memberValues.setAccessible(true);
            //获取所有的注解属性--map集合
            Map<String, Object> values = (Map<String, Object>) memberValues.get(invocationHandler);
            //覆盖原有属性值
            values.put(modifyField, paramName);
            return annotation;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 获取当前注解
     * @param className         当前类名
     * @param annotationName    注解名
     * @param name              方法名、类名、属性名之一
     * @param type              注解类型
     * @return
     * @throws Exception
     */
    public static Annotation getAnnotation(Class className,Class annotationName,String name,Integer type) throws Exception {
        switch (type){
            case 1:
                Method method = className.getDeclaredMethod(name);
                return method.getAnnotation(annotationName);
            case 2:
                System.out.println("2");
                return null;
            case 3:
                System.out.println("3");
                return null;
        }
        return null;
    }
}
